<?php

namespace app\console\task\tetr;

use app\console\task\Task;
use think\facade\Cache;

/**
 * 扩展任务类
 * Class BasicTetrTask
 * @package app\console\task\tetr
 */
class BasicTetrTask extends Task
{
    /**
     * 返回一个代理地址
     * @return array|false
     */
    protected function getProxyAddress()
    {
        return $this->listDmProxy();
    }

    /**
     * 多米付费代理
     * @return array|false
     */
    private function listDmProxy()
    {
        $lockName = 'dmdaili_lock'; // 锁定缓存名称
        $proxyCacheName = 'proxyAddressCache'; // 结果缓存名称

        // 请求参数
        $queryDomain = 'http://api.dmdaili.com/dmgetip.asp';
        $queryParams = [
            'apikey'   => '42379564',
            'pwd'      => '8663d967e828964c69e4014746ef268b',
            'getnum'   => 1,
            'httptype' => 1,
            'geshi'    => 2,
            'fenge'    => 1,
            'fengefu'  => '',
            'operate'  => 'all',
        ];

        // 如果没有缓存则请求代理地址
        if (!Cache::has($proxyCacheName) && !Cache::has($lockName)) {
            Cache::set($lockName, 1, 15); // 15秒内只请求1次
            $res = file_get_contents($queryDomain . '?' . http_build_query($queryParams));
            $res = json_decode($res, true);
            if ($res && isset($res['code']) && $res['code'] == 0) {
                Cache::set($proxyCacheName, json_encode($res['data']), 30); // 保底30秒存活
            }
        }

        // 从缓存中取代理地址
        $resources = json_decode(Cache::get($proxyCacheName), true);
        if ($resources) {
            $proxy = $resources[array_rand($resources)];
            return [$proxy['ip'], $proxy['port']];
        }

        return false;
    }
}
